package edu.dayu.demo2;

/**
 * 给定一个正整数数组 nums和整数 k ，请找出该数组内乘积小于 k 的连续的子数组的个数。
 * 输入: nums = [10,5,2,6], k = 100
 * 输出: 8
 * 解释: 8 个乘积小于 100 的子数组分别为: [10], [5], [2], [6], [10,5], [5,2], [2,6], [5,2,6]。
 * 需要注意的是 [10,5,2] 并不是乘积小于100的子数组。
 * 思路：滑动窗口  首先确定一个思想，碰到 》k 就计算一次总合
 */
public class 乘积小于K的子数组 {
    public static void main(String[] args) {
        int[] nums = {10,2,2,5,4,4,4,3,7,7};
        int k = 289;
        System.out.println(numSubarrayProductLessThanK(nums,k));
    }

    public static int numSubarrayProductLessThanK(int[] nums, int k) {
        int cur = 1;
        int l = 0;
        int r = 0;
        int res = 0;
        while(r < nums.length) {
            cur *= nums[r];
            while(l <= r && cur >= k) {
                cur /= nums[l];
                l++;
            }
            //以r为结尾，子数组必须包含nums[r]这个数，因此存在
            //nums[r]
            //nums[r], nums[r - 1]
            //nums[r], nums[r - 2]
            //nums[r], nums[r - 2]... , nums[l]
            //即 r - l + 1个符合条件的子数组
            res += (r - l + 1);
            r++;
        }
        return res;
    }
}
